/*
 *    This program is free software; you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation; either version 2 of the License, or
 *    (at your option) any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with this program; if not, write to the Free Software
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *    2010 year
 *    Author: Michael Khromov aka MikeDM (Mike D'Morto)
 *    E-Mail: mikedmorto@gmail.com
 */

#ifndef DBTHREAD_H
#define DBTHREAD_H

#define TH "db_mysql thread"

#include <QThread>
#include <QtSql>

struct FList{
    QString pl_name,fname;
    QList<QVariant> parameters;
};


class DbThread : public QThread
{
    Q_OBJECT
public:
    explicit DbThread(QString server, QString user, QString pass, QString dbname,QObject *parent = 0);
    // метод постановки в очередь запроса.
    void putQuery(const QString & data);
    // метод постановки в очередь функции запроса.
    void putFun(const QString pl_name,const QString & fname,const QList<QVariant> & parameters);
    void clearID(int id);
    // метод добавляющий в очередь плагинов на запрос синхроного режима.
    void putSinq(const QString &pl_name);
    void putFunS(const QString pl_name,const QString & fname,const QList<QVariant> & parameters);
    void stopSinq(const QString & pl_name);

private:
    QString sqlsafe(const QString & str);
    QString dserver,duser, dpass, dname,quer;
    bool execq; // разрешение на выборку запроса из очереди.
    bool isFun; // разрешение на каскадное исполнение функции.
    bool isFunS; // разрешение на каскадное исполнение функции в синхронном режиме
    void run();
    QSqlQuery exportQuery;
    // асинхронный режим. в данном режиме невозможны транзакции.
    // список запросов отданных на обработку в асинхронном режиме.
    QMap<int,QSqlQuery> qlist;
    // очередь запросов функций.
    QList<FList> flist;
    // синхронный режим, в этом режиме работают транзакции. но они вызываются на стороне функций.
    // поэтому немного стоит извратиться.
    // ЗЫ этот режим жизненно необходим для обновления записей в бд.
    QStringList sinqS; // очередь плагинов попросивших синхронный режим.
    FList flistS; // структура хранящая синхронный запрос


signals:
    // сигнал возвращающий данные от запроса в основной поток.
    void sigFinish(int id,QSqlQuery * ret);
    // сигнал высылается при ошибке работы с бд.
    // естественно дальше его должны поймать и завершить приложение.
    // любая ошибка работы с бд критична. и продолжать работу приложения нет смысла.
    // параметры, текстовка ошибки
    void sigError(const QString & plName , const QString & errtext);
    // событие записи в лог
    void sigThPutLog(const QString & owner,int level,const QString & text);
    // сигнал разрещающий начать синхронный канал.
    void sigStartOkS(const QString & pl_name);
    // сигнал в основной поток об окончании запроса. удачный.
    // имя плагина, собственно сам запрос
    void sigFinishS(const QString & pl_name ,QSqlQuery * ret);
    // сигнал в основной поток об окончании запроса. неудачный.
    void sigErrorS(const QString & plName , const QString & errtext);

public slots:

};

#endif // DBTREAD_H
